<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		
		<script type="text/javascript">
			// function compileFunction(param1, param2){
			// 	var closuer1 = param1;
			// 	var closuer2 = param2;
			// 	
			// 	function matchFunction(){
			// 		console.log(closuer1);
			// 		console.log(param2);
			// 	}
			// 	
			// 	return matchFunction;
			// };
			
			//外部的编译函数,内部定义了一个匹配函数,调用编译函数时,返回匹配函数,
			// 此时外部编译函数为内部匹配函数提供了闭包,定义的变量不会被释放掉
			// console.log(compileFunction(1, 2)());
			//返回undefined,运行函数时没有返回东西
			
			
			
			// elementMatcher
			
			// 1. 将matchers数组中的多个匹配函数编译为一个匹配函数
			// 2. 所有的匹配函数接口都是(elem),或者是(elem, context)
			// 3. matches存在于elementMatcher的闭包中
			
			// function compileFunction1(param1, param2){
			// 	function matchFunction1(elem, context){
			// 		console.log(elem);
			// 		console.log("check TAG li");
			// 		return true;
			// 	}
			// 	
			// 	return matchFunction1;
			// };
			// 
			// function compileFunction2(parma1, param2){
			// 	function matchFunction2(elem, context){
			// 		console.log(elem);
			// 		console.log('chexk CALSS cls1');
			// 		return true;
			// 	}
			// 	return matchFunction2;
			// };
			// 
			// m = [];
			// 
			// m.push(compileFunction1(1,2));
			// m.push(compileFunction2(3,4));
			// 
			// // 4. 把同一个element的多个匹配函数编译为一个匹配函数
			// 
			// function elementMatcher(matchers){
			// 	return matchers.length > 1 ?
			// 	function(elem, context){
			// 		var i = matchers.length;
			// 		while(i--){
			// 			if(!matchers[i](elem, context)){
			// 				return false;
			// 			}
			// 		}
			// 		return true;
			// 	} :
			// 	matchers[0];
			// }
			// 
			// var fnNew = elementMatcher(m);// li.cls1
			// 
			// console.log(fnNew);
			// console.log(fnNew('elem', 'context'));
			
			
			// div>li,cls1
			function compileFunction3(param1, param2){
				function matchFunction3(elem, context){ // 针对父元素
					console.log(elem);
					console.log('check TAG div ');
					return true;
				}
				return matchFunction3;
			}
			function compileFunction1(param1, param2){
				function matchFunction1(elem, context){
					console.log(elem);
					console.log("check TAG li");
					return true;
				}
				
				return matchFunction1;
			};
			
			function compileFunction2(parma1, param2){
				function matchFunction2(elem, context){
					console.log(elem);
					console.log('chexk CALSS cls1');
					return true;
				}
				return matchFunction2;
			};
	
			// 4. 把同一个element的多个匹配函数编译为一个匹配函数
			
			function elementMatcher(matchers){
				return matchers.length > 1 ?
				function(elem, context){
					var i = matchers.length;
					while(i--){
						if(!matchers[i](elem, context)){
							return false;
						}
					}
					return true;
				} :
				matchers[0];
			}
			
			// addCombinator, 用于处理层级关系
			// 处理 >
			function addCombinator(matcher){
				return function(elem, context){
					var elemParent = elem + 'parent';
					// console.log(elemParent);
					return matcher(elemParent, context);
				}
			}
			
			var f3 = compileFunction3(5,6);
			
			m = [addCombinator(elementMatcher([f3]))];			
			m.push(compileFunction1(1,2));
			m.push(compileFunction2(3,4));
			
			var fnNew = elementMatcher(m); // div>li.cls;
			console.log(fnNew);
			console.log(fnNew('elem', 'context'));
			
		</script>
	</body>
</html>
